﻿using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HeBianGu.Control.Chart2D;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using static System.Net.Mime.MediaTypeNames;

namespace ZeroBug.PersonalityEvaluation
{
    public partial class DataStatisticsViewModel : ObservableObject
    {
        List<Person> orginPerson;
        [ObservableProperty]
        ObservableCollection<Person> testPersons;
        [ObservableProperty]
        string aTCEScore;
        [ObservableProperty]
        Person currentSelectedPerson;
        [ObservableProperty]
        DoubleCollection scoreCollection;
        [ObservableProperty]
        double aCWeight = 0.4;
        [ObservableProperty]
        double cTWeight = 0.4;
        [ObservableProperty]
        double aEWeight = 0.4;
        [ObservableProperty]
        double eTWeight = 0.4;
        [ObservableProperty]
        string testTime;
        [ObservableProperty]
        string adminName;

        [ObservableProperty]
        string aCTip = "特点：很传统，注重细节,条理分明，责任感强,重视纪律。保守、分析力强，精准度高,喜欢把细节条例化，个性拘谨含蓄。\r\n" +
                       "优点：天生就有爱找出事情真相的习性，因为他们有耐心仔细考察所有的细节并想出合乎逻辑的解决办法。\r\n" +
                       "缺点:把事实和精确度置于感情之前，这会被认为是感情冷漠。在压力下，有时为了避免做出结论，他们会分析过度。\r\n" +
                       "猫头鹰型工作风格的主要行为：\r\n\t很少有面部表情;\r\n\t动作缓慢;\r\n\t使用精确的语言、注意特殊细节；\r\n\t办公室里挂有图表、统计数字等。\r\n" +
                       "猫头鹰斯诺具有高度精确的能力,其行事风格，重规则轻情感,事事以规则为准绳，并以之为主导思想。\r\n" +
                       "他性格内敛、善于以数字或规条为表达工具而不大擅长以语言来沟通情感或向同事和部属等作指示。\r\n" +
                       "他行事讲究条理分明、守纪律重承诺,是个完美主义者。\r\n" +
                       "架构稳定和制度健全的组织最好聘用猫头鹰型的人来当各级领导人,因为猫头鹰型领导人喜欢在安全架构的环境中工作，且其表现也会最好.\r\n" +
                       "其行事讲究制度化，事事求依据和规律的习性,极为适合事务机构的行事方式。\r\n" +
                       "然而，当企业需要进行目标重整、结构重组、流程变革时,猫头鹰型领导人就会产生迷失，不知如何处事，也不知如何自处。\r\n" +
                       "对改革行动，上者会先保持观望的态度,再慢慢适应新的局面;中者也会先保持观望的态度,然后呈辞求去；下者则会结集反\r\n" +
                       "对力量，公然表示反对或隐晦地从事反对等的行为。\r\n" +
                       "又由于猫头鹰型人的行事决策风格，是以数据和规则为其主导思想,其直觉能力和应变能力都偏低,随而创造和创新能力也相对地弱，因而不宜担任需要创建或创新能力的任务。\r\n" +
                       "组织完善和发展安定的企业，宜用猫头鹰型企管人当家。他们尊重传统、重视架构、事事求据喜爱工作安定的性格，是企业安定力量的来源。\r\n" +
                       "然而，由于他们行事讲究制度化，事事求依据和规律，故会将细节条例化,事事检查以求正确无误，\r\n" +
                       "甚至为了办事精确，不惜对人吹毛求疵或挑剔别人的错误,以显现自己一切照章办事的态度和求取完美的精神,不易维持团队内的团结精神和凝聚力."
;
        [ObservableProperty]
        string cTTip = "特点：有自信，够权威,决断力高，竞争性强,胸怀大志，喜欢评估.\r\n" +
                       "企图心强烈,喜欢冒险,个性积极，竞争力强，有对抗性. \r\n" +
                       "优点：善于控制局面并能果断地作出决定的能力;用这一类型工作方 \r\n式的人成就非凡。\r\n" +
                       "缺点：当感到压力时，这类人就会太重视迅速的完成工作，就容易忽 \r\n视细节，他们可能不顾自己和别人的情感。由于他们要求过高，加之好胜的天性，有时会成为工作狂。 \r\n" +
                       "老虎型工作风格的主要行为： \r\n\t交谈时进行直接的目光接触； \r\n\t有目的性且能迅速行动; \r\n\t说话快速且具有说服力； \r\n\t运用直截了当的实际性语言； \r\n\t办公室挂有日历、计划要点。 \r\n" +
                       "老虎泰格，具备高支配型特质，竞争力强、好胜心盛、积极自信，是个有决断力的组织者。\r\n" +
                       "他胸怀大志、勇于冒险、分析敏锐，主动积极且具极为强烈的企图心，只要认定目标就勇往直前，不畏反抗与攻讦，誓要取得目标的家伙.\r\n" +
                       "老虎型领导人都倾向以权威作风来进行决策，当其部属者除要高度服从外,也要有冒险犯难的勇气,为其杀敌闯关。\r\n" +
                       "老虎型族人最适合开创性与改革性的工作，在开拓市场的时代或需要执行改革的环境中，最容易有出色的表现。\r\n" +
                       "宏碁集团的施振荣和前美国GE总裁韦尔奇 （Jack Welch)等，都是老虎型领导人。";
        [ObservableProperty]
        string aETip = "“考拉”属于行事稳健，不会夸张强调平实的人，性情平和对人不喜欢制造麻烦，不兴风作浪，温和善良,\r\n" +
                       "在别人眼中常让人误以为是懒散不积极，但只要决心投入,绝对是“路遥知马力”的最佳典型。\r\n" +
                       "对考拉要多给予关注和温柔想方设法挖掘他们内在的潜力。\r\n" +
                       "印度的甘地、蒋经国、宋庆龄都是此类型的人,一般而言，宗教信仰者都是“考拉”，而中国正是考拉型最多的摇篮.\r\n" +
                       "特点:很稳定,够敦厚，温和规律，不好冲突。行事稳健、强调平实,有过人的耐力，温和善良.\r\n" +
                       "优点：他们对其他人的感情很敏感，这使他们在集体环境中左右逢源.\r\n" +
                       "缺点：很难坚持自己的观点和迅速做出决定。一般说来，他们不喜欢面对与同事意见不和的局面，他们不愿处理争执。\r\n" +
                       "考拉型工作风格的主要行为:\r\n\t面部表情和蔼可亲；\r\n\t说话慢条斯理,声音轻柔；\r\n\t用赞同型、鼓励性的语言;\r\n\t办公室里摆有家人的照片。\r\n\t考拉具有高度的耐心。他敦厚随和，行事冷静自持；生活讲求律规但也随缘从容，面对困境，都能泰然自若。\r\n" +
                       "考拉熊型领导人，适宜当安定内部的管理工作,在需要专业精密技巧的领域,或在气氛和谐且不具赶迫时间表等的职场环境中，他们最能发挥所长。\r\n" +
                       "当企业的产品稳踞市场时,考拉型的企业领导人是极佳的总舵手。\r\n" +
                       "但当企业还在开拓市场的时候，老虎型或孔雀型的人似乎较占优势。\r\n" +
                       "或许，勇于开疆辟土的老虎型的人当一哥，配以与人为善的考拉型人当二把手，也是好的搭配。\r\n" +
                       "考拉熊型领导人强调无为而治,能与周围的人和睦相处而不树敌，是极佳的人事领导者，适宜在企业改革后，为公司和员工重建互信的工作。\r\n" +
                       "又由于他们具有高度的耐心性，有能力为企业赚取长远的利益,或为公司打好永续经营的基础.";
        [ObservableProperty]
        string eTTip = "“孔雀”热情洋溢,好交朋友，口才流畅,重视形象,擅于人际关系的建立，富同情心，最适合人际导向的工作。\r\n" +
                       "缺点是容易过于乐观，往往无法估计细节，在执行力度上需要高专业的技术精英来配合。\r\n" +
                       "对孔雀要以鼓励为主给他表现机会保持他的工作激情,但也要注意他的情绪化和防止细节失误。\r\n" +
                       "孙中山、克林顿、里根、戈尔巴乔夫都是这一类型的人，美国是孔雀型人最多的国家。\r\n" +
                       "特点：很热心,够乐观，口才流畅，好交朋友,风度翩翩，诚恳热心。热情洋溢、好交朋友、口才流畅、个性乐观、表现欲强。\r\n" +
                       "优点:此类型的人生性活泼。能够使人兴奋，他们高效地工作，善于建立同盟或搞好关系来实现目标。他们很适合需要当众表现、引人注目、态度公开的工作.\r\n" +
                       "缺点：因其跳跃性的思考模式，常无法顾及细节以及对事情的完成执着度。\r\n孔雀型工作风格的主要行为：\r\n\t运用快速的手势；\r\n\t面部表情特别丰富；\r\n\t运用有说服力的语言；\r\n\t工作空间里充满了各种能鼓舞人心的东西。\r\n\t孔雀百利具有高度的表达能力，他的社交能力极强，有流畅无碍的口才和热情幽默的风度,在团体或社群中容易广结善缘、建立知名度。\r\n" +
                       "孔雀型领导人天生具备乐观与和善的性格，有真诚的同情心和感染他人的能力，在以团队合作为主的工作环境中,会有最好的表现。\r\n" +
                       "孔雀型领导人在任何团体内，都是人缘最好的人和最受欢迎的人,是最能吹起领导号角的人物。\r\n" +
                       "当孔雀型领导人的部属者，除要能乐于在团队中工作外，还要对其领导谦逊得体，不露锋、不出头,把一切成功光华都让与领导。\r\n" +
                       "孔雀型领导人,不宜有个老虎型领导人当二把手或部属。反之，若老虎型领导人有个孔雀型的人甘愿当其二把手，则会是最佳搭配.\r\n" +
                       "孔雀型的人天生具有鼓吹理想的特质，在推动新思维、执行某种新使命或推广某项宣传等任务的工作中，都会有极出色的表现。他们在开发市场或创建产业的工作环境中，最能发挥其所长.\r\n";
        public DataStatisticsViewModel()
        {
        }

        public void LoadPerson()
        {
            TestPersons = new ObservableCollection<Person>();
            orginPerson = new List<Person>();
            DataTable? dt = App.Current.Services.GetService<IDatabase>()!.Select("Select * from Personality;", out string errInfo);
            if (dt != null)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Person p = new Person()
                    {
                        Name = item["Name"].ToString(),
                        Score = new ATCESore()
                        {
                            AScore = Convert.ToInt32(item["AScore"]),
                            TScore = Convert.ToInt32(item["TScore"]),
                            CScore = Convert.ToInt32(item["CScore"]),
                            EScore = Convert.ToInt32(item["EScore"]),
                        },
                        DoTestTime = DateTime.Parse(item["TestTime"].ToString()),
                    };
                    orginPerson.Add(p);
                    testPersons.Add(p);
                }
                CurrentSelectedPerson = TestPersons[1];
            }
        }
        partial void OnCurrentSelectedPersonChanged(Person? oldValue, Person newValue)
        {
            if (newValue != null)
            {
                ScoreCollection = new DoubleCollection();
                ScoreCollection.Add(newValue.Score.TScore);
                ScoreCollection.Add(newValue.Score.EScore);
                ScoreCollection.Add(newValue.Score.AScore);
                ScoreCollection.Add(newValue.Score.CScore);

                TestTime = $"测试时间: {newValue.DoTestTime.ToString("yyyy-MM-dd HH:mm:ss")}";

                if ((newValue.Score.TScore == newValue.Score.EScore) &&
                    (newValue.Score.EScore == newValue.Score.AScore) &&
                    (newValue.Score.EScore == newValue.Score.CScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 0.4;
                    ACWeight = 0.4;
                    CTWeight = 0.4;
                }
                else if ((newValue.Score.TScore >= newValue.Score.EScore) &&
                         (newValue.Score.EScore >= newValue.Score.AScore) &&
                         (newValue.Score.EScore >= newValue.Score.CScore))
                {
                    ETWeight = 1;
                    AEWeight = 0.4;
                    ACWeight = 0.4;
                    CTWeight = 0.4;
                }
                if ((newValue.Score.EScore >= newValue.Score.TScore) &&
                    (newValue.Score.TScore >= newValue.Score.AScore) &&
                    (newValue.Score.TScore >= newValue.Score.CScore))
                {
                    ETWeight = 1;
                    AEWeight = 0.4;
                    ACWeight = 0.4;
                    CTWeight = 0.4;
                }
                else if ((newValue.Score.AScore >= newValue.Score.EScore) &&
                         (newValue.Score.EScore >= newValue.Score.TScore) &&
                         (newValue.Score.EScore >= newValue.Score.CScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 1;
                    ACWeight = 0.4;
                    CTWeight = 0.4;
                }
                else if ((newValue.Score.EScore >= newValue.Score.AScore) &&
                         (newValue.Score.AScore >= newValue.Score.TScore) &&
                         (newValue.Score.AScore >= newValue.Score.CScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 1;
                    ACWeight = 0.4;
                    CTWeight = 0.4;
                }
                else if ((newValue.Score.AScore >= newValue.Score.CScore) &&
                         (newValue.Score.CScore >= newValue.Score.EScore) &&
                         (newValue.Score.CScore >= newValue.Score.TScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 0.4;
                    ACWeight = 1;
                    CTWeight = 0.4;
                }
                else if ((newValue.Score.CScore >= newValue.Score.AScore) &&
                         (newValue.Score.AScore >= newValue.Score.EScore) &&
                         (newValue.Score.AScore >= newValue.Score.TScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 0.4;
                    ACWeight = 1;
                    CTWeight = 0.4;
                }
                else if ((newValue.Score.CScore >= newValue.Score.TScore) &&
                         (newValue.Score.TScore >= newValue.Score.EScore) &&
                         (newValue.Score.TScore >= newValue.Score.AScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 0.4;
                    ACWeight = 0.4;
                    CTWeight = 1;
                }
                else if ((newValue.Score.TScore >= newValue.Score.CScore) &&
                         (newValue.Score.CScore >= newValue.Score.EScore) &&
                         (newValue.Score.CScore >= newValue.Score.AScore))
                {
                    ETWeight = 0.4;
                    AEWeight = 0.4;
                    ACWeight = 0.4;
                    CTWeight = 1;
                }


                var view = App.Current.Services.GetService<DataStatisticsView>();
                (view.FindName("radar") as PolarChart).RefreshByData();
            }
        }

        [RelayCommand]
        public void Search(string text)
        {
            if (text == null)
                return;
            if (text == string.Empty)
            {
                TestPersons.Clear();
                TestPersons = new ObservableCollection<Person>(orginPerson);
            }
            else
            {
                TestPersons.Clear();
                TestPersons = new ObservableCollection<Person>(orginPerson.Where(p => p.Name.Contains(text)));
            }
        }
        [RelayCommand]
        public void RevisePassword()
        {
            var window = App.Current.Services.GetService<RevisePasswordView>();
            window.ShowDialog();
        }
    }
}
